/*
 * @Author: 詹真琦(legendryztachi@gmail.com)
 * @Date: 2021-10-25 15:10:26
 * @LastEditors: 詹真琦(legendryztachi@gmail.com)
 * @LastEditTime: 2022-04-22 11:13:34
 * @FilePath: \code\cwp-front\pc-collaboration\src\utils\emitter.js
 * @Description: 简单的事件发布订阅
 */
class EventEmitter {
    subs = {
        any: [],
    };
    /**
     * @description: 添加订阅
     * @param {string}channel 订阅频道
     * @param {function}fn 执行方法
     */
    subscribe(channel = 'any', fn) {
        if (!this.subs[channel]) {
            this.subs[channel] = [];
        }
        this.subs[channel].push(fn); // 将订阅方法保存在数组里
    }
    /**
     * @description: 添加订阅。一次之后取消
     * @param {string}channel 订阅频道
     * @param {function}fn 执行方法
     */
    subscribeOne(channel = 'any', fn) {
        const execute = (...args) => {
            fn(...args);
            this.unsubscribe(channel, execute);
        };
        this.subscribe(channel, execute);
    }
    /**
     * @description: 退订
     * @param {string}channel 退订频道
     * @param {function}fn 订阅添加的执行方法
     */
    unsubscribe(channel = 'any', fn) {
        //没指定，就删除所有
        if (!fn) Reflect.deleteProperty(this.subs, channel);
        // 将退订的方法从数组中移除
        this.subs[channel] = this.subs[channel].filter((item) => item !== fn);
    }
    /**
     * @description: 发布
     * @param {string}channel 订阅频道
     * @param {any}args 各种参数
     */
    async publish(channel = 'any', ...args) {
        let sub = this.subs[channel];
        for (let fn in sub) {
            await sub[fn](...args);// 根据不同的类型调用相应的方法
        }
    }

    getAll() {
        return this.subs;
    }
}

export default new EventEmitter();
